//Set函数可以接受一个具有 iterable 接口的数据结构作为参数（数组或类数组）
//iterable接口：Set/Map/数组/arguments/元素集合/字符串
//默认去除重复项
var arr=[1,2,2,1];
var s =new Set([1,2,3,3]);
console.log(new Set(arr)); //Set { 1, 2 }
console.log(s); //Set { 1, 2, 3 }
console.log(new Set('1234'));  //Set { '1', '2', '3', '4' }
(function(){
	console.log(new Set(arguments))
})(1,2,3,4,5,6);  //Set { 1, 2, 3, 4, 5, 6 }
//注意：箭头函数没有arguments，只能用普通函数

//size方法统计项目数 类似于数组的length
console.log(s.size); //3

// Array.from(set)或者[...set]方法可将Set对象转化为数组
console.log(Array.from(s));  //[ 1, 2, 3 ]
console.log([...s]);   //[ 1, 2, 3 ]

//add()方法 添加项
//如果之前没有此项的话才会添加，有此项的话默认去重
//返回值为增加后的实例本身,故可以实现链式写法
//参数一次只能增加一个
console.log(s.add(4)); //返回值Set { 1, 2, 3, 4 }
console.log(s.add(4).add(5)); //链式Set { 1, 2, 3, 4, 5 }

//delete()方法删除项，参数为需要删除的项，只能删一个
//返回值为布尔值,如果原实例中含有删除的项，则返回true,没有则返回false
s.delete(1);
console.log(s.delete(1)); //已经被删掉了，所以返回false
console.log(s); //Set { 2, 3, 4, 5 }

//has()检查是否含有
//返回值为布尔值
console.log(s.has(5)); //true
console.log(s.has(1)); //false

//clear()清空所有项，没有参数
//没有返回值。也就是返回undefined
s.clear();
console.log(s.clear());  //undefined
console.log(s); //Set {}

//forEach使用回调函数遍历每个成员，类似于jquary中的forEach
//返回值为多次数组
//由于Set只有值没有键，可以认为值等于键，key=value
//forEach((val,key,this)=>{})返回的val和key都是当前项value,this为当前实例
let set = new Set([9,8,7,6,5])
set.forEach((...res)=>{
	console.log('forEach:',res)
});   
//返回5次
//forEach: [ 9, 9, Set { 9, 8, 7, 6, 5 } ]
//forEach: [ 8, 8, Set { 9, 8, 7, 6, 5 } ]
//forEach: [ 7, 7, Set { 9, 8, 7, 6, 5 } ]
//forEach: [ 6, 6, Set { 9, 8, 7, 6, 5 } ]
//forEach: [ 5, 5, Set { 9, 8, 7, 6, 5 } ]

//values返回键值得遍历器\keys返回键名的遍历器(实际返回的也是value)
//keys、values方法返回的都是遍历器对象
//由于 Set 结构没有键名，只有键值（或者说键名和键值是同一个值）
//所以keys方法和values方法的行为完全一致。
let set2 = new Set(['red', 'green', 'blue']);
for (let item of set2.keys()) {
  console.log(item);
}
// red
// green
// blue
for (let item of set2.values()) {
  console.log(item);
}
// red
// green
// blue

//entries返回键值对的遍历器(键与值相同)
for (let item of set2.entries()) {
  console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]


//let setOfWords1 = new Set([1, 2, 3]);
//let setOfWords2 = new Set([3, 5, 2]); 
var Array1 = [5,6,7,8,18,9,90,81]; 
var Array2 = [10,415,54,87,98,65,81];
let a = new Set(Array1);
let b = new Set(Array2); 

// 并集（合并对象的话，相同的要去除，所以用Set对象）
let unionSet = new Set([...a, ...b]);
let unionSet1 = Array.from(unionSet);
console.log(unionSet1);

// 交集
let intersectionSet = new Set([...a].filter(x => b.has(x)));
let intersectionSet1 = Array.from(intersectionSet);
console.log(intersectionSet1);

// 差集
let differenceABSet = new Set([...a].filter(x => !b.has(x)));
let differenceABSet1 = Array.from(differenceABSet);
console.log(differenceABSet1);

//去重
function unique2(arr) {   //使用ES6的Set()方法,需ES6环境
	var set=new Set(arr);
	//return Array.from(set); //将Set对象转化为数组
	return [...set]   //将Set对象转化为数组
}